﻿#include <boost/json.hpp>
#include <iostream>
#include <thread>

namespace json = boost::json;

/**
 * 字符串转换为json对象
 * @param content
 * @return
 */
json::value paresJson(const std::string &content) {
    return json::parse(content);
}

/**
 * 线程休眠
 * @param milliseconds
 */
void sleep(int milliseconds) {
    std::this_thread::sleep_for(std::chrono::milliseconds(milliseconds));
}


namespace boost::json {
    // 通用对象的自动化序列化
    template<typename T>
    void tag_invoke(const value_from_tag &, json::value &jv, const T &obj) {
        jv = json::value_from(static_cast<const void *>(&obj)); // 默认处理（需特化）
    }
}

//demo with json
struct Product {
    int id;
    std::string name;
    double price;
};

// 特化 Product 的序列化
namespace boost::json {
    template<>
    void tag_invoke(const value_from_tag &, json::value &jv, const Product &p) {
        jv = {
            {"id", p.id},
            {"name", p.name},
            {"price", p.price},
        };
    }

    // 为 Product 特化反序列化
    Product tag_invoke(const value_to_tag<Product> &, const json::value &jv) {
        const json::object &obj = jv.as_object();
        return Product{
            (int) obj.at("id").as_int64(),
            std::string(obj.at("name").as_string()),
            obj.at("price").as_double(),
        };
    }
}
